package com.wn;

import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

/**
 * @author yellow Docter
 * @date 2023 -07-25
 * @desc
 *
 *    MQ 作用:
 *     1、削峰    2、解耦     3、处理异步
 *
 *    MQ的 产品:   Kafka(大数据)、RocketMQ (阿里java)、RabbitMQ( erlang语言 )
 *
 *    MQ的组件:
 *       1、生产者 :     发送消息到MQ的对象
 *       2、连接Connect  通过host、username\pwd + 网络 连接  MQ
 *       3、交换机       不存储消息、进行消息分发到 不同的队列中
 *       4、路由         交换机通过路由 发送消息 到 不同的队列中
 *       5、队列         存储消息的 容器
 *       6、消费者       消费MQ 中的消息 (消息来自生产者)
 *
 *     MQ的消息模型:
 *        1、简单队列模式:    一个生产者发送消息到MQ、消费者从MQ 拿到消息进行消费
 *        2、广播模型(fanout):        一个生产者 给多个消费者发送消息
 *                           EXchangeType.FANOUT (广播交换机)
 *        3、routingKey :   一个生产者、通过routingKey 给 指定的消费者发送消息
 *        、                 EXchangeType.DIRECT 通过 通过routingKey 分发消息到队列
 *                           routingKey:交换机通过路由 发送消息 到 不同的队列中
 *
 *        4、topic           一个生产者通过routingkey 设置 特殊字符 发送到不同的 消息队列中
 *                            routingKey 中的特殊字符:
 *                                    #    替换0个或者多个字符串  hello.#  hello 后面可以有多个字符
 *                                    *    替换一个字符          hello.*  hello 后面只能有一个字符
 *
 *      消费者:
 *      @RabbitListener              用在消费者的方法上面
 *      @QueueBinding                把消费者的消费方法和交换机队列进行绑定
 *                                   value     绑定 队列
 *                                   exchange  绑定 交换机
 *                                   key       交互和队列通过key进行绑定
 *      @Queue
 *                                   name      队列的名称
 *      @Exchange
 *                                   name       交换机的名称
 *                                   type       交换机的类型
 *
 *     消息的可靠性:
 *      1、生者发布消息到  MQ中
 *                  confirmcallback 机制    消息到 exchange
 *                  returncallback  机制    消息从 exchange 到  queue中
 *
 *      2、消息在队列中
 *                  队列中的消息会进行持久化  ( 未消费的消息、会写入到电脑磁盘中 )
 *                  MQ 的集群搭建 ( 镜像队列 )
 *
 *      3、消费者消费   丢失
 *                    手动应答机制
 *
 *     死信队列：
 *         1、消费者 拒绝消息 消息会进死信队列
 *         2、ttl  消息过期 会进死信队列
 *         3、队列的长度满、消息进死信队列
 *
 *     使用场景:
 *        1、订单付款时间 倒计时      15分钟 付款、添加死信队列     ttl = 15min    死信消费的时候、订单结束
 *        2、消息堆积   (生产者 消息生产的太多、可以设置ttl、到期的消息到死信队列中 进行处理)
 *
 *      MQ的对象发送
 *       1、生者 需要配置 json 转换器、发送到  MQ中
 *       2、消费者 配置json 转换器 、通过@PayLoad 拿到 数据转成对应的Java对象
 *
 */
@SpringBootApplication
public class ProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class,args);
    }

    //配置json 转换器
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}
